#include <stdio.h>
#include "outcode.h"

int f1(unsigned n)
{
    int sum = 1, power = 1;
    for (unsigned i = 0; i <= n - 1; i++)
    {
        power *= 2;
        sum += power;
    }
    
    return sum;

}

float f2(unsigned n)
{
    float sum = 1, power = 1;
    for (unsigned i = 0; i <= n - 1; i++)
    {
        power *= 2;
        sum += power;
    }
    
    return sum;

}

int f_int(int n)
{
    int sum = 1, power = 1;
    for (int i = 0; i <= n - 1; i++)
    {
        power *= 2;
        sum += power;
    }
    
    return sum;

}


void solution1()
{
    // 死循环 n 为无符号数，n - 1 = 2^32 - 1 无符号整形最大值
    f1(0);
    
    // 不会死循环，因为 n - 1 = -1  
    f_int(0);
}

void solution2()
{
    int i = f1(23); // 2 ^ 24 - 1   0000 0000 1111 1111 1111 1111 1111 1111
    float f = f2(23); // 1.111 1111 1111 1111 1111 1111 * 2 ^ 23     0 1001 0110 111 1111 1111 1111 1111 1111
    // 机器码不同
    out_4byte((char *)&i); printf(" = f1(23) = %d\n", i); // 00FF FFFFH
    out_4byte((char *)&f); printf(" = f2(23) = %f\n", f); // 4B7F FFFFH
    // 真值相同
    if (i == f) {
        printf("%d\n", 1);
    }
}

void solution3()
{
    int i = f1(24); // 2 ^ 25 - 1   0000 0001 1111 1111 1111 1111 1111 1111
    /* 
    1.1111 1111 1111 1111 1111 1111 * 2 ^ 24  0 1001 0110 111 1111 1111 1111 1111 1111
    后数舍入 1.0 * 2 ^ 25  0 1001 1000 000 0000 0000 0000 0000 0000 0000
    */
    float f = f2(24); 
    // 机器码不同
    out_4byte((char *)&i); printf(" = f1(24) = %d\n", i); // 01FFFFFF = f1(24) = 33554431
    out_4byte((char *)&f); printf(" = f2(24) = %f\n", f); // 4C000000 = f2(24) = 33554432.000000
    // 为什么比较出来会相同呢？
    if (i == f) {
        printf("%d\n", 1);
    }
}

void solution4()
{
    int i = f1(31); 
    int max = f1(30); // 最大值
    out_4byte((char *)&i); printf(" = f1(31) = %d\n", i); // FFFFFFFF = f1(31) = -1
    out_4byte((char *)&max); printf(" = f1(30) = %d\n", max); // 7FFFFFFF = f1(30) = 2147483647
}

void solution5()
{
    float i = f2(127); 
    float max = f2(126); 
    out_4byte((char *)&i); printf(" = f2(127) = %f\n", i); // 7F800000 = f2(127) = inf 超出浮点数表示范围（值溢出）
    out_4byte((char *)&max); printf(" = f2(126) = %f\n", max); // 7F000000 = f2(126) = 170141183460469231731687303715884105728.000000
}

void main()
{
    // solution1();

    // solution2();

    // solution3();

    // solution4();

    solution5();


}